package com.learn.spring.test;

import com.learn.spring.config.SpringConfig;
import com.learn.spring.service.AnnotationDemoService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Case3 {

    /**
     * 1、什么是注解
     * (1) 注解是代码特殊标记，格式:@注解名称(属性名称=属性值, 属性名称=属性值...)
     * (2) 使用注解，注解作用在类上面，方法上面，属性上面。
     * (3) 使用注解目的:简化 xml配置,
     *
     * 2、Spring 针对 Bean 管理中创建对象提供注解
     * (1) @Component 普通bean
     * (2) @Service 业务服务
     * (3) @Controller web控制器
     * (4) @Repository Dao或持久层
     * 上面四个注解功能是一样的,都可以用来创建 bean 实例。在实际开发中我们约定将四个分别用于不通处理域，如：上述描述
     */

    @Test
    public void test1() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans4.xml");
        AnnotationDemoService demoService = context.getBean("demoService", AnnotationDemoService.class);
        demoService.show();
    }

    /**
     * 基于注解方式实现属性注入
     * (1) @Autowired: 根据属性类型进行自动装配
     *  1. 把 service 和 dao 对象创建，在 service 和 dao 类添加创建对象注解
     *  2. 在 service 注入 dao 对象，在 service 类添加 dao 类型属性，在属性上面使用注解 @Autowired 修饰.
     *
     * (2) @Qualifier: 根据属性名称进行注入
     *  这个 @Qualifier 注解的使用，和上面 @Autowired 一起使用。
     *  实用属性 value 来设置 bean 的 name 属性。bean 默认的那么属性是类名首字母小写，也可以通过描述 bean 注解的value属性来指定别的name
     *
     * (3) @Resource: 可以根据类型注入，可以根据名称注入
     * (4) @Value: 注入普通类型属性
     */
    @Test
    public void test2() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans4.xml");
        AnnotationDemoService demoService = context.getBean("demoService", AnnotationDemoService.class);
        demoService.info();
    }

    /**
     * 完全注解开发：
     * (1) 创建配置类，替代xml配置文件
     */
    @Test
    public void test3() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        AnnotationDemoService demoService = context.getBean("demoService", AnnotationDemoService.class);
        demoService.info();
    }
}
